/**
 * 修复商品图片数据脚本
 * 解决以下问题：
 * 1. images数组中的base64数据应该转换为文件URL或移除
 * 2. mainImage字段为"undefined"或占位符URL的应该设置为images数组中的第一个有效URL
 */

const mongoose = require('mongoose');
const Product = require('./src/models/product.model');
require('dotenv').config();

const MONGODB_URI = process.env.MONGODB_URI || 'mongodb+srv://2264521353:1234567890@six0.hic1spu.mongodb.net/goshop';

async function fixProductImages() {
  try {
    console.log('连接到数据库...');
    await mongoose.connect(MONGODB_URI);
    console.log('数据库连接成功');

    // 获取所有商品
    const products = await Product.find({});
    console.log(`找到 ${products.length} 个商品`);

    let fixedCount = 0;

    for (const product of products) {
      let needsUpdate = false;
      const updates = {};

      console.log(`\n处理商品: ${product.name}`);
      console.log(`当前mainImage: ${product.mainImage}`);
      console.log(`当前images数组长度: ${product.images ? product.images.length : 0}`);

      // 处理images数组
      if (product.images && product.images.length > 0) {
        const validImages = [];

        for (let i = 0; i < product.images.length; i++) {
          const image = product.images[i];

          if (!image) {
            console.log(`  - 图片${i + 1}: 空值，跳过`);
            continue;
          }

          // 检查是否是base64数据
          if (image.startsWith('data:image/')) {
            console.log(`  - 图片${i + 1}: base64数据 (长度: ${image.length})，移除`);
            // 跳过base64数据，不添加到validImages中
            continue;
          }

          // 检查是否是有效的HTTP URL
          if (image.startsWith('http://') || image.startsWith('https://')) {
            console.log(`  - 图片${i + 1}: 有效URL - ${image}`);
            validImages.push(image);
          } else if (image.startsWith('/uploads/')) {
            // 相对路径，转换为完整URL
            const fullUrl = `http://localhost:3002${image}`;
            console.log(`  - 图片${i + 1}: 相对路径转换为完整URL - ${fullUrl}`);
            validImages.push(fullUrl);
          } else {
            console.log(`  - 图片${i + 1}: 无效格式 - ${image.substring(0, 50)}...`);
          }
        }

        // 如果validImages与原数组不同，需要更新
        if (validImages.length !== product.images.length ||
          !validImages.every((img, idx) => img === product.images[idx])) {
          updates.images = validImages;
          needsUpdate = true;
          console.log(`  更新images数组: ${product.images.length} -> ${validImages.length}`);
        }

        // 处理mainImage
        const currentMainImage = product.mainImage;

        // 如果mainImage是"undefined"字符串、空值、或者是占位符URL
        if (!currentMainImage ||
          currentMainImage === 'undefined' ||
          currentMainImage.includes('placeholder.com') ||
          currentMainImage.includes('via.placeholder.com')) {

          if (validImages.length > 0) {
            updates.mainImage = validImages[0];
            needsUpdate = true;
            console.log(`  更新mainImage: "${currentMainImage}" -> "${validImages[0]}"`);
          } else {
            console.log(`  警告: 没有有效图片可设置为mainImage`);
          }
        } else if (currentMainImage.startsWith('data:image/')) {
          // 如果mainImage也是base64数据
          if (validImages.length > 0) {
            updates.mainImage = validImages[0];
            needsUpdate = true;
            console.log(`  更新mainImage: base64数据 -> "${validImages[0]}"`);
          } else {
            updates.mainImage = null;
            needsUpdate = true;
            console.log(`  清空mainImage: base64数据 -> null`);
          }
        }
      } else {
        console.log(`  商品没有图片数据`);
      }

      // 执行更新
      if (needsUpdate) {
        try {
          await Product.findByIdAndUpdate(product._id, updates);
          fixedCount++;
          console.log(`  ✅ 商品更新成功`);
        } catch (error) {
          console.error(`  ❌ 更新商品失败:`, error.message);
        }
      } else {
        console.log(`  ℹ️  商品无需更新`);
      }
    }

    console.log(`\n=== 修复完成 ===`);
    console.log(`总商品数: ${products.length}`);
    console.log(`已修复商品数: ${fixedCount}`);

  } catch (error) {
    console.error('修复过程中出错:', error);
  } finally {
    await mongoose.disconnect();
    console.log('数据库连接已关闭');
  }
}

// 运行修复脚本
if (require.main === module) {
  fixProductImages();
}

module.exports = { fixProductImages };
